<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/atomic64_64.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/atomic64_64.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X0FTTV9YODZfQVRPTUlDNjRfNjRfSF8w"><span class="b">_ASM_X86_ATOMIC64_64_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X0FTTV9YODZfQVRPTUlDNjRfNjRfSF8w"><span class="b">_ASM_X86_ATOMIC64_64_H</span></a>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="True">       5:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><a href="cpu.c_macros_ref.html#_YWx0ZXJuYXRpdmVfMA__"><span class="b">alternative</span></a><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="6" /><span class="True">       6:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><a href="cpu.c_macros_ref.html#_Y21weGNoZ18w"><span class="b">cmpxchg</span></a><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="7" /><span class="True">       7:</span> 
<a name="8" /><span class="True">       8:</span> <span class="k">/* The 64-bit atomic type */</span>
<a name="9" /><span class="True">       9:</span> 
<a name="10" /><span class="True">      10:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVRPTUlDNjRfSU5JVF8w"><span class="b">ATOMIC64_INIT</span></a><span class="f">(</span><span class="b">i</span><span class="f">)</span>    <span class="f">{</span> <span class="f">(</span><span class="b">i</span><span class="f">)</span> <span class="f">}</span>
<a name="11" /><span class="True">      11:</span> 
<a name="12" /><span class="True">      12:</span> <span class="k">/**</span>
<a name="13" /><span class="True">      13:</span> <span class="k"> * atomic64_read - read atomic64 variable</span>
<a name="14" /><span class="True">      14:</span> <span class="k"> * @v: pointer of type atomic64_t</span>
<a name="15" /><span class="True">      15:</span> <span class="k"> *</span>
<a name="16" /><span class="True">      16:</span> <span class="k"> * Atomically reads the value of @v.</span>
<a name="17" /><span class="True">      17:</span> <span class="k"> * Doesn&apos;t imply a read memory barrier.</span>
<a name="18" /><span class="True">      18:</span> <span class="k"> */</span>
<a name="19" /><span class="True">      19:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">long</span> <span class="b">atomic64_read</span><span class="f">(</span><span class="m">const</span> <span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="20" /><span class="True">      20:</span> <span class="f">{</span>
<a name="21" /><span class="True">      21:</span>     <span class="m">return</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="m">volatile</span> <span class="m">long</span> <span class="f">*</span><span class="f">)</span><span class="f">&amp;</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">)</span><span class="f">;</span>
<a name="22" /><span class="True">      22:</span> <span class="f">}</span>
<a name="23" /><span class="True">      23:</span> 
<a name="24" /><span class="True">      24:</span> <span class="k">/**</span>
<a name="25" /><span class="True">      25:</span> <span class="k"> * atomic64_set - set atomic64 variable</span>
<a name="26" /><span class="True">      26:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="27" /><span class="True">      27:</span> <span class="k"> * @i: required value</span>
<a name="28" /><span class="True">      28:</span> <span class="k"> *</span>
<a name="29" /><span class="True">      29:</span> <span class="k"> * Atomically sets the value of @v to @i.</span>
<a name="30" /><span class="True">      30:</span> <span class="k"> */</span>
<a name="31" /><span class="True">      31:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">atomic64_set</span><span class="f">(</span><span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">long</span> <span class="b">i</span><span class="f">)</span>
<a name="32" /><span class="True">      32:</span> <span class="f">{</span>
<a name="33" /><span class="True">      33:</span>     <span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span> <span class="f">=</span> <span class="b">i</span><span class="f">;</span>
<a name="34" /><span class="True">      34:</span> <span class="f">}</span>
<a name="35" /><span class="True">      35:</span> 
<a name="36" /><span class="True">      36:</span> <span class="k">/**</span>
<a name="37" /><span class="True">      37:</span> <span class="k"> * atomic64_add - add integer to atomic64 variable</span>
<a name="38" /><span class="True">      38:</span> <span class="k"> * @i: integer value to add</span>
<a name="39" /><span class="True">      39:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="40" /><span class="True">      40:</span> <span class="k"> *</span>
<a name="41" /><span class="True">      41:</span> <span class="k"> * Atomically adds @i to @v.</span>
<a name="42" /><span class="True">      42:</span> <span class="k"> */</span>
<a name="43" /><span class="True">      43:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">atomic64_add</span><span class="f">(</span><span class="m">long</span> <span class="b">i</span><span class="f">,</span> <span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="44" /><span class="True">      44:</span> <span class="f">{</span>
<a name="45" /><span class="True">      45:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <span class="e">&quot;addq %1,%0&quot;</span>
<a name="46" /><span class="True">      46:</span>              <span class="f">:</span> <span class="e">&quot;=m&quot;</span> <span class="f">(</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">)</span>
<a name="47" /><span class="True">      47:</span>              <span class="f">:</span> <span class="e">&quot;er&quot;</span> <span class="f">(</span><span class="b">i</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;m&quot;</span> <span class="f">(</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="48" /><span class="True">      48:</span> <span class="f">}</span>
<a name="49" /><span class="True">      49:</span> 
<a name="50" /><span class="True">      50:</span> <span class="k">/**</span>
<a name="51" /><span class="True">      51:</span> <span class="k"> * atomic64_sub - subtract the atomic64 variable</span>
<a name="52" /><span class="True">      52:</span> <span class="k"> * @i: integer value to subtract</span>
<a name="53" /><span class="True">      53:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="54" /><span class="True">      54:</span> <span class="k"> *</span>
<a name="55" /><span class="True">      55:</span> <span class="k"> * Atomically subtracts @i from @v.</span>
<a name="56" /><span class="True">      56:</span> <span class="k"> */</span>
<a name="57" /><span class="True">      57:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">atomic64_sub</span><span class="f">(</span><span class="m">long</span> <span class="b">i</span><span class="f">,</span> <span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="58" /><span class="True">      58:</span> <span class="f">{</span>
<a name="59" /><span class="True">      59:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <span class="e">&quot;subq %1,%0&quot;</span>
<a name="60" /><span class="True">      60:</span>              <span class="f">:</span> <span class="e">&quot;=m&quot;</span> <span class="f">(</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">)</span>
<a name="61" /><span class="True">      61:</span>              <span class="f">:</span> <span class="e">&quot;er&quot;</span> <span class="f">(</span><span class="b">i</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;m&quot;</span> <span class="f">(</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="62" /><span class="True">      62:</span> <span class="f">}</span>
<a name="63" /><span class="True">      63:</span> 
<a name="64" /><span class="True">      64:</span> <span class="k">/**</span>
<a name="65" /><span class="True">      65:</span> <span class="k"> * atomic64_sub_and_test - subtract value from variable and test result</span>
<a name="66" /><span class="True">      66:</span> <span class="k"> * @i: integer value to subtract</span>
<a name="67" /><span class="True">      67:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="68" /><span class="True">      68:</span> <span class="k"> *</span>
<a name="69" /><span class="True">      69:</span> <span class="k"> * Atomically subtracts @i from @v and returns</span>
<a name="70" /><span class="True">      70:</span> <span class="k"> * true if the result is zero, or false for all</span>
<a name="71" /><span class="True">      71:</span> <span class="k"> * other cases.</span>
<a name="72" /><span class="True">      72:</span> <span class="k"> */</span>
<a name="73" /><span class="True">      73:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic64_sub_and_test</span><span class="f">(</span><span class="m">long</span> <span class="b">i</span><span class="f">,</span> <span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="74" /><span class="True">      74:</span> <span class="f">{</span>
<a name="75" /><span class="True">      75:</span>     <a href="cpu.c_macros_ref.html#_R0VOX0JJTkFSWV9STVdjY18w"><span class="b">GEN_BINARY_RMWcc</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <span class="e">&quot;subq&quot;</span><span class="f">,</span> <span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">,</span> <span class="e">&quot;er&quot;</span><span class="f">,</span> <span class="b">i</span><span class="f">,</span> <span class="e">&quot;%0&quot;</span><span class="f">,</span> <span class="e">&quot;e&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="76" /><span class="True">      76:</span> <span class="f">}</span>
<a name="77" /><span class="True">      77:</span> 
<a name="78" /><span class="True">      78:</span> <span class="k">/**</span>
<a name="79" /><span class="True">      79:</span> <span class="k"> * atomic64_inc - increment atomic64 variable</span>
<a name="80" /><span class="True">      80:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="81" /><span class="True">      81:</span> <span class="k"> *</span>
<a name="82" /><span class="True">      82:</span> <span class="k"> * Atomically increments @v by 1.</span>
<a name="83" /><span class="True">      83:</span> <span class="k"> */</span>
<a name="84" /><span class="True">      84:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">atomic64_inc</span><span class="f">(</span><span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="85" /><span class="True">      85:</span> <span class="f">{</span>
<a name="86" /><span class="True">      86:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <span class="e">&quot;incq %0&quot;</span>
<a name="87" /><span class="True">      87:</span>              <span class="f">:</span> <span class="e">&quot;=m&quot;</span> <span class="f">(</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">)</span>
<a name="88" /><span class="True">      88:</span>              <span class="f">:</span> <span class="e">&quot;m&quot;</span> <span class="f">(</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="89" /><span class="True">      89:</span> <span class="f">}</span>
<a name="90" /><span class="True">      90:</span> 
<a name="91" /><span class="True">      91:</span> <span class="k">/**</span>
<a name="92" /><span class="True">      92:</span> <span class="k"> * atomic64_dec - decrement atomic64 variable</span>
<a name="93" /><span class="True">      93:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="94" /><span class="True">      94:</span> <span class="k"> *</span>
<a name="95" /><span class="True">      95:</span> <span class="k"> * Atomically decrements @v by 1.</span>
<a name="96" /><span class="True">      96:</span> <span class="k"> */</span>
<a name="97" /><span class="True">      97:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">atomic64_dec</span><span class="f">(</span><span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="98" /><span class="True">      98:</span> <span class="f">{</span>
<a name="99" /><span class="True">      99:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <span class="e">&quot;decq %0&quot;</span>
<a name="100" /><span class="True">     100:</span>              <span class="f">:</span> <span class="e">&quot;=m&quot;</span> <span class="f">(</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">)</span>
<a name="101" /><span class="True">     101:</span>              <span class="f">:</span> <span class="e">&quot;m&quot;</span> <span class="f">(</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="102" /><span class="True">     102:</span> <span class="f">}</span>
<a name="103" /><span class="True">     103:</span> 
<a name="104" /><span class="True">     104:</span> <span class="k">/**</span>
<a name="105" /><span class="True">     105:</span> <span class="k"> * atomic64_dec_and_test - decrement and test</span>
<a name="106" /><span class="True">     106:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="107" /><span class="True">     107:</span> <span class="k"> *</span>
<a name="108" /><span class="True">     108:</span> <span class="k"> * Atomically decrements @v by 1 and</span>
<a name="109" /><span class="True">     109:</span> <span class="k"> * returns true if the result is 0, or false for all other</span>
<a name="110" /><span class="True">     110:</span> <span class="k"> * cases.</span>
<a name="111" /><span class="True">     111:</span> <span class="k"> */</span>
<a name="112" /><span class="True">     112:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic64_dec_and_test</span><span class="f">(</span><span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="113" /><span class="True">     113:</span> <span class="f">{</span>
<a name="114" /><span class="True">     114:</span>     <a href="cpu.c_macros_ref.html#_R0VOX1VOQVJZX1JNV2NjXzA_"><span class="b">GEN_UNARY_RMWcc</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <span class="e">&quot;decq&quot;</span><span class="f">,</span> <span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">,</span> <span class="e">&quot;%0&quot;</span><span class="f">,</span> <span class="e">&quot;e&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="115" /><span class="True">     115:</span> <span class="f">}</span>
<a name="116" /><span class="True">     116:</span> 
<a name="117" /><span class="True">     117:</span> <span class="k">/**</span>
<a name="118" /><span class="True">     118:</span> <span class="k"> * atomic64_inc_and_test - increment and test</span>
<a name="119" /><span class="True">     119:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="120" /><span class="True">     120:</span> <span class="k"> *</span>
<a name="121" /><span class="True">     121:</span> <span class="k"> * Atomically increments @v by 1</span>
<a name="122" /><span class="True">     122:</span> <span class="k"> * and returns true if the result is zero, or false for all</span>
<a name="123" /><span class="True">     123:</span> <span class="k"> * other cases.</span>
<a name="124" /><span class="True">     124:</span> <span class="k"> */</span>
<a name="125" /><span class="True">     125:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic64_inc_and_test</span><span class="f">(</span><span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="126" /><span class="True">     126:</span> <span class="f">{</span>
<a name="127" /><span class="True">     127:</span>     <a href="cpu.c_macros_ref.html#_R0VOX1VOQVJZX1JNV2NjXzA_"><span class="b">GEN_UNARY_RMWcc</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <span class="e">&quot;incq&quot;</span><span class="f">,</span> <span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">,</span> <span class="e">&quot;%0&quot;</span><span class="f">,</span> <span class="e">&quot;e&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="128" /><span class="True">     128:</span> <span class="f">}</span>
<a name="129" /><span class="True">     129:</span> 
<a name="130" /><span class="True">     130:</span> <span class="k">/**</span>
<a name="131" /><span class="True">     131:</span> <span class="k"> * atomic64_add_negative - add and test if negative</span>
<a name="132" /><span class="True">     132:</span> <span class="k"> * @i: integer value to add</span>
<a name="133" /><span class="True">     133:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="134" /><span class="True">     134:</span> <span class="k"> *</span>
<a name="135" /><span class="True">     135:</span> <span class="k"> * Atomically adds @i to @v and returns true</span>
<a name="136" /><span class="True">     136:</span> <span class="k"> * if the result is negative, or false when</span>
<a name="137" /><span class="True">     137:</span> <span class="k"> * result is greater than or equal to zero.</span>
<a name="138" /><span class="True">     138:</span> <span class="k"> */</span>
<a name="139" /><span class="True">     139:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic64_add_negative</span><span class="f">(</span><span class="m">long</span> <span class="b">i</span><span class="f">,</span> <span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="140" /><span class="True">     140:</span> <span class="f">{</span>
<a name="141" /><span class="True">     141:</span>     <a href="cpu.c_macros_ref.html#_R0VOX0JJTkFSWV9STVdjY18w"><span class="b">GEN_BINARY_RMWcc</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a> <span class="e">&quot;addq&quot;</span><span class="f">,</span> <span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">,</span> <span class="e">&quot;er&quot;</span><span class="f">,</span> <span class="b">i</span><span class="f">,</span> <span class="e">&quot;%0&quot;</span><span class="f">,</span> <span class="e">&quot;s&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="142" /><span class="True">     142:</span> <span class="f">}</span>
<a name="143" /><span class="True">     143:</span> 
<a name="144" /><span class="True">     144:</span> <span class="k">/**</span>
<a name="145" /><span class="True">     145:</span> <span class="k"> * atomic64_add_return - add and return</span>
<a name="146" /><span class="True">     146:</span> <span class="k"> * @i: integer value to add</span>
<a name="147" /><span class="True">     147:</span> <span class="k"> * @v: pointer to type atomic64_t</span>
<a name="148" /><span class="True">     148:</span> <span class="k"> *</span>
<a name="149" /><span class="True">     149:</span> <span class="k"> * Atomically adds @i to @v and returns @i + @v</span>
<a name="150" /><span class="True">     150:</span> <span class="k"> */</span>
<a name="151" /><span class="True">     151:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">long</span> <span class="b">atomic64_add_return</span><span class="f">(</span><span class="m">long</span> <span class="b">i</span><span class="f">,</span> <span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="152" /><span class="True">     152:</span> <span class="f">{</span>
<a name="153" /><span class="True">     153:</span>     <span class="m">return</span> <span class="b">i</span> <span class="f">+</span> <a href="cpu.c_macros_ref.html#_eGFkZF8w"><span class="b">xadd</span></a><span class="f">(</span><span class="f">&amp;</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">,</span> <span class="b">i</span><span class="f">)</span><span class="f">;</span>
<a name="154" /><span class="True">     154:</span> <span class="f">}</span>
<a name="155" /><span class="True">     155:</span> 
<a name="156" /><span class="True">     156:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">long</span> <span class="b">atomic64_sub_return</span><span class="f">(</span><span class="m">long</span> <span class="b">i</span><span class="f">,</span> <span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="157" /><span class="True">     157:</span> <span class="f">{</span>
<a name="158" /><span class="True">     158:</span>     <span class="m">return</span> <span class="b">atomic64_add_return</span><span class="f">(</span><span class="f">-</span><span class="b">i</span><span class="f">,</span> <span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="159" /><span class="True">     159:</span> <span class="f">}</span>
<a name="160" /><span class="True">     160:</span> 
<a name="161" /><span class="True">     161:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YXRvbWljNjRfaW5jX3JldHVybl8w"><span class="b">atomic64_inc_return</span></a><span class="f">(</span><span class="b">v</span><span class="f">)</span>  <span class="f">(</span><span class="b">atomic64_add_return</span><span class="f">(</span><span class="c">1</span><span class="f">,</span> <span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="162" /><span class="True">     162:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YXRvbWljNjRfZGVjX3JldHVybl8w"><span class="b">atomic64_dec_return</span></a><span class="f">(</span><span class="b">v</span><span class="f">)</span>  <span class="f">(</span><span class="b">atomic64_sub_return</span><span class="f">(</span><span class="c">1</span><span class="f">,</span> <span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="163" /><span class="True">     163:</span> 
<a name="164" /><span class="True">     164:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">long</span> <span class="b">atomic64_cmpxchg</span><span class="f">(</span><span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">long</span> <span class="b">old</span><span class="f">,</span> <span class="m">long</span> <span class="m">new</span><span class="f">)</span>
<a name="165" /><span class="True">     165:</span> <span class="f">{</span>
<a name="166" /><span class="True">     166:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_Y21weGNoZ18w"><span class="b">cmpxchg</span></a><span class="f">(</span><span class="f">&amp;</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">)</span><span class="f">;</span>
<a name="167" /><span class="True">     167:</span> <span class="f">}</span>
<a name="168" /><span class="True">     168:</span> 
<a name="169" /><span class="True">     169:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">long</span> <span class="b">atomic64_xchg</span><span class="f">(</span><span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">long</span> <span class="m">new</span><span class="f">)</span>
<a name="170" /><span class="True">     170:</span> <span class="f">{</span>
<a name="171" /><span class="True">     171:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_eGNoZ18w"><span class="b">xchg</span></a><span class="f">(</span><span class="f">&amp;</span><span class="b">v</span><span class="f">-&gt;</span><span class="b">counter</span><span class="f">,</span> <span class="m">new</span><span class="f">)</span><span class="f">;</span>
<a name="172" /><span class="True">     172:</span> <span class="f">}</span>
<a name="173" /><span class="True">     173:</span> 
<a name="174" /><span class="True">     174:</span> <span class="k">/**</span>
<a name="175" /><span class="True">     175:</span> <span class="k"> * atomic64_add_unless - add unless the number is a given value</span>
<a name="176" /><span class="True">     176:</span> <span class="k"> * @v: pointer of type atomic64_t</span>
<a name="177" /><span class="True">     177:</span> <span class="k"> * @a: the amount to add to v...</span>
<a name="178" /><span class="True">     178:</span> <span class="k"> * @u: ...unless v is equal to u.</span>
<a name="179" /><span class="True">     179:</span> <span class="k"> *</span>
<a name="180" /><span class="True">     180:</span> <span class="k"> * Atomically adds @a to @v, so long as it was not @u.</span>
<a name="181" /><span class="True">     181:</span> <span class="k"> * Returns the old value of @v.</span>
<a name="182" /><span class="True">     182:</span> <span class="k"> */</span>
<a name="183" /><span class="True">     183:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">atomic64_add_unless</span><span class="f">(</span><span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">,</span> <span class="m">long</span> <span class="b">a</span><span class="f">,</span> <span class="m">long</span> <span class="b">u</span><span class="f">)</span>
<a name="184" /><span class="True">     184:</span> <span class="f">{</span>
<a name="185" /><span class="True">     185:</span>     <span class="m">long</span> <span class="b">c</span><span class="f">,</span> <span class="b">old</span><span class="f">;</span>
<a name="186" /><span class="True">     186:</span>     <span class="b">c</span> <span class="f">=</span> <span class="b">atomic64_read</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="187" /><span class="True">     187:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">;</span><span class="f">;</span><span class="f">)</span> <span class="f">{</span>
<a name="188" /><span class="True">     188:</span>         <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="b">c</span> <span class="f">==</span> <span class="f">(</span><span class="b">u</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="189" /><span class="True">     189:</span>             <span class="m">break</span><span class="f">;</span>
<a name="190" /><span class="True">     190:</span>         <span class="b">old</span> <span class="f">=</span> <span class="b">atomic64_cmpxchg</span><span class="f">(</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">,</span> <span class="b">c</span><span class="f">,</span> <span class="b">c</span> <span class="f">+</span> <span class="f">(</span><span class="b">a</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="191" /><span class="True">     191:</span>         <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_bGlrZWx5XzA_"><span class="b">likely</span></a><span class="f">(</span><span class="b">old</span> <span class="f">==</span> <span class="b">c</span><span class="f">)</span><span class="f">)</span>
<a name="192" /><span class="True">     192:</span>             <span class="m">break</span><span class="f">;</span>
<a name="193" /><span class="True">     193:</span>         <span class="b">c</span> <span class="f">=</span> <span class="b">old</span><span class="f">;</span>
<a name="194" /><span class="True">     194:</span>     <span class="f">}</span>
<a name="195" /><span class="True">     195:</span>     <span class="m">return</span> <span class="b">c</span> <span class="f">!=</span> <span class="f">(</span><span class="b">u</span><span class="f">)</span><span class="f">;</span>
<a name="196" /><span class="True">     196:</span> <span class="f">}</span>
<a name="197" /><span class="True">     197:</span> 
<a name="198" /><span class="True">     198:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_YXRvbWljNjRfaW5jX25vdF96ZXJvXzA_"><span class="b">atomic64_inc_not_zero</span></a><span class="f">(</span><span class="b">v</span><span class="f">)</span> <span class="b">atomic64_add_unless</span><span class="f">(</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">,</span> <span class="c">1</span><span class="f">,</span> <span class="c">0</span><span class="f">)</span>
<a name="199" /><span class="True">     199:</span> 
<a name="200" /><span class="True">     200:</span> <span class="k">/*</span>
<a name="201" /><span class="True">     201:</span> <span class="k"> * atomic64_dec_if_positive - decrement by 1 if old value positive</span>
<a name="202" /><span class="True">     202:</span> <span class="k"> * @v: pointer of type atomic_t</span>
<a name="203" /><span class="True">     203:</span> <span class="k"> *</span>
<a name="204" /><span class="True">     204:</span> <span class="k"> * The function returns the old value of *v minus 1, even if</span>
<a name="205" /><span class="True">     205:</span> <span class="k"> * the atomic variable, v, was not decremented.</span>
<a name="206" /><span class="True">     206:</span> <span class="k"> */</span>
<a name="207" /><span class="True">     207:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">long</span> <span class="b">atomic64_dec_if_positive</span><span class="f">(</span><span class="b">atomic64_t</span> <span class="f">*</span><span class="b">v</span><span class="f">)</span>
<a name="208" /><span class="True">     208:</span> <span class="f">{</span>
<a name="209" /><span class="True">     209:</span>     <span class="m">long</span> <span class="b">c</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="b">dec</span><span class="f">;</span>
<a name="210" /><span class="True">     210:</span>     <span class="b">c</span> <span class="f">=</span> <span class="b">atomic64_read</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">;</span>
<a name="211" /><span class="True">     211:</span>     <span class="m">for</span> <span class="f">(</span><span class="f">;</span><span class="f">;</span><span class="f">)</span> <span class="f">{</span>
<a name="212" /><span class="True">     212:</span>         <span class="b">dec</span> <span class="f">=</span> <span class="b">c</span> <span class="f">-</span> <span class="c">1</span><span class="f">;</span>
<a name="213" /><span class="True">     213:</span>         <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="b">dec</span> <span class="f">&lt;</span> <span class="c">0</span><span class="f">)</span><span class="f">)</span>
<a name="214" /><span class="True">     214:</span>             <span class="m">break</span><span class="f">;</span>
<a name="215" /><span class="True">     215:</span>         <span class="b">old</span> <span class="f">=</span> <span class="b">atomic64_cmpxchg</span><span class="f">(</span><span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">,</span> <span class="b">c</span><span class="f">,</span> <span class="b">dec</span><span class="f">)</span><span class="f">;</span>
<a name="216" /><span class="True">     216:</span>         <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_bGlrZWx5XzA_"><span class="b">likely</span></a><span class="f">(</span><span class="b">old</span> <span class="f">==</span> <span class="b">c</span><span class="f">)</span><span class="f">)</span>
<a name="217" /><span class="True">     217:</span>             <span class="m">break</span><span class="f">;</span>
<a name="218" /><span class="True">     218:</span>         <span class="b">c</span> <span class="f">=</span> <span class="b">old</span><span class="f">;</span>
<a name="219" /><span class="True">     219:</span>     <span class="f">}</span>
<a name="220" /><span class="True">     220:</span>     <span class="m">return</span> <span class="b">dec</span><span class="f">;</span>
<a name="221" /><span class="True">     221:</span> <span class="f">}</span>
<a name="222" /><span class="True">     222:</span> 
<a name="223" /><span class="True">     223:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _ASM_X86_ATOMIC64_64_H */</span>
<a name="224" /><span class="True">     224:</span> </pre>
  </body>
</html>
